package main

import "fmt"

func main() {
	// 声明一个包含5个整数的数组（默认初始化为零值）
	var arr1 [5]int
	fmt.Println("arr1:", arr1) // 输出: [0 0 0 0 0]

	// 声明并初始化数组（指定长度）
	arr2 := [3]string{"苹果", "香蕉", "橙子"}
	fmt.Println("arr2:", arr2) // 输出: [苹果 香蕉 橙子]

	// 声明数组时让编译器推断长度（使用 ...）
	arr3 := [...]int{10, 20, 30, 40}
	fmt.Printf("arr3类型: %T, 值: %v\n", arr3, arr3) // 输出: [4]int, [10 20 30 40]

	// 指定索引的初始化方式
	arr4 := [5]int{1: 100, 3: 300}
	fmt.Println("arr4:", arr4) // 输出: [0 100 0 300 0]

	// 访问和修改数组元素
	arr2[1] = "芒果"
	fmt.Println("修改后的arr2:", arr2) // 输出: [苹果 芒果 橙子]

	// 遍历数组（标准for循环）
	fmt.Println("\n遍历arr3:")
	for i := 0; i < len(arr3); i++ {
		fmt.Printf("索引:%d 值:%d\n", i, arr3[i])
	}

	// 遍历数组（range关键字）
	fmt.Println("\n遍历arr2:")
	for index, value := range arr2 {
		fmt.Printf("索引:%d 值:%s\n", index, value)
	}

	// 数组是值类型（赋值会复制整个数组）
	arrCopy := arr3
	arrCopy[0] = 999
	fmt.Println("\n原始数组:", arr3)      // 输出: [10 20 30 40]
	fmt.Println("复制后修改的数组:", arrCopy) // 输出: [999 20 30 40]

	// 多维数组示例
	var matrix [2][3]int
	matrix[0] = [3]int{1, 2, 3}
	matrix[1][1] = 5
	fmt.Println("\n二维数组:", matrix) // 输出: [[1 2 3] [0 5 0]]

	// 数组比较（长度和元素类型相同的数组可以比较）
	a := [2]int{1, 2}
	b := [2]int{1, 2}
	c := [2]int{1, 3}
	fmt.Println("\n数组比较:")
	fmt.Println("a == b:", a == b) // true
	fmt.Println("a == c:", a == c) // false
}
